#ifndef SINTATICO_H_
#define SINTATICO_H_

#include <queue>
#include <vector>
#include "Procedimento.h"
#include "ListaIdentificadores.h"
#include "HashIdentificadores.h"
#include "NoHash.h"
#include "ParametroFormal.h"
#include "VariavelSimples.h"
#include "NoArvore.h"


//atributos relacionados com os identificadores

//variavel simples

	
	

class Sintatico {

public:
	//recebe a lista de identificadores do lexico 
	Sintatico(ListaIdentificadores &,HashIdentificadores&, NoArvore & );
	//programa
	bool Programa();
	void Bloco(NoArvore *);
	void Tipo(NoArvore*);
	void ParametrosFormais();
	//sobrecarga para formar procedimento
	void ParametrosFormais(Procedimento *,NoArvore*);
	void Comando(NoArvore*);
	void Expressao(NoArvore*);
	//fator
	void Fator(NoArvore *);
	//void expressao simples;
	void ExpressaoSimples(NoArvore*);
	// termo
	void Termo(NoArvore *);
	// percorre a lista chamando os metodos necessarios
	void Parsing();
	//expressao entre parenteses
	void ExEntreParenteses(NoArvore *);
	// numero
	void Numero(NoArvore *);
	//identificador
	void Identificador();
	//comando sem rotulo
	void ComandoSemRotulo(NoArvore*);
	//comando composta
	void ComandoComposto(NoArvore*);
	//insere na hash
	void InsereHash(int , Procedimento * ,NoArvore *);
	// insere na arvore
	NoArvore * InsereArvore(string, bool, NoArvore *);
	NoArvore * InsereArvore(string, bool, NoArvore *,NoHash *);
	void MostraArvore();
	virtual ~Sintatico();
	
private:
	
	HashIdentificadores mHashIdentificadores;
	ListaIdentificadores mLista;
	NoArvore mArvore;
	int mNivel;
	int mDeslocamento;
	int mPassagem;
	
};

#endif /*SINTATICO_H*/
